package com.gen.info.generate_cluster_information.Listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.CellExtra;
import com.alibaba.excel.read.listener.ReadListener;
import com.gen.info.generate_cluster_information.mode.OceanBaseClusterInfo;
import com.gen.info.generate_cluster_information.mode.OceanBaseClusterInfoDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;

import java.util.*;
@Slf4j
public class ReadOceanBaseListener implements ReadListener<OceanBaseClusterInfo> {
   // private List<OceanBaseClusterInfo> excelinfo=new ArrayList<OceanBaseClusterInfo>();

    public static HashMap<String,OceanBaseClusterInfoDO> clusterInfos = new HashMap<String,OceanBaseClusterInfoDO>();
   //解析过程中出现异常调用该方法
    @Override
    public void onException(Exception e, AnalysisContext analysisContext) throws Exception {

     log.info("出现异常了！！！！！！！！！！！"+analysisContext.toString());
    }
    //读取execl表头时调用
    @Override
    public void invokeHead(Map<Integer, CellData> map, AnalysisContext analysisContext) {
     log.info("读取execl表头");
    }
    //在读取到一条数据时调用
    @Override
    public void invoke(OceanBaseClusterInfo oceanBaseClusterInfo, AnalysisContext analysisContext) {
     //判断是否是第一进入的租户
    if (oceanBaseClusterInfo!=null&&clusterInfos.get(oceanBaseClusterInfo.getTenant())==null){
     final OceanBaseClusterInfoDO oceanBaseClusterInfoDO = new OceanBaseClusterInfoDO();
     //复制相同部分的值
     BeanUtils.copyProperties(oceanBaseClusterInfo,oceanBaseClusterInfoDO);
     //创建数据库、用户、密码的list
     final ArrayList<String> dataBaseList = new ArrayList<>();
     final ArrayList<String> userlist = new ArrayList<>();
     final ArrayList<String> passwordList = new ArrayList<>();
     //添加用户和数据库到集合
     dataBaseList.add(oceanBaseClusterInfo.getDatabase());
     userlist.add(oceanBaseClusterInfo.getUsers());
     passwordList.add(oceanBaseClusterInfo.getPassword());
     oceanBaseClusterInfoDO.setDatabases(dataBaseList);
     oceanBaseClusterInfoDO.setUsers(userlist);
     oceanBaseClusterInfoDO.setPassword(passwordList);
     clusterInfos.put(oceanBaseClusterInfo.getTenant(),oceanBaseClusterInfoDO);
     //如果不是第一次进入只存数据库名字
    }else if (oceanBaseClusterInfo!=null&&clusterInfos.get(oceanBaseClusterInfo.getTenant())!=null){
     final OceanBaseClusterInfoDO oceanBaseClusterInfoDO = clusterInfos.get(oceanBaseClusterInfo.getTenant());
     //添加数据库
     final List<String> databases = oceanBaseClusterInfoDO.getDatabases();
     databases.add(oceanBaseClusterInfo.getDatabase());
     oceanBaseClusterInfoDO.setDatabases(databases);
     //添加用户
     final List<String> users = oceanBaseClusterInfoDO.getUsers();
     users.add(oceanBaseClusterInfo.getUsers());
     oceanBaseClusterInfoDO.setUsers(users);
     //添加密码
     final List<String> password = oceanBaseClusterInfoDO.getPassword();
     password.add(oceanBaseClusterInfo.getPassword());
     oceanBaseClusterInfoDO.setPassword(password);
     //放入clusterInfos
     clusterInfos.put(oceanBaseClusterInfo.getTenant(),oceanBaseClusterInfoDO);
    }
    }
    //在读取 Excel 文件中除数据外的其他内容时调用的方法。例如，批注、超链接等。可以在该方法中进行相应的处理
    @Override
    public void extra(CellExtra cellExtra, AnalysisContext analysisContext) {

    }
    //在读取数据完成后调用的方法。可以在该方法中进行一些资源清理工作或者记录日志等操作
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
     printTenantInfo();
       log.info("所有数据解析完成！！");
    }
    //判断是否还有下一条数据需要读取。如果返回 true，会自动调用 invoke(T data, AnalysisContext analysisContext) 方法来读取下一条数据；
    // 如果返回 false，则结束读取数据的过程。
    @Override
    public boolean hasNext(AnalysisContext analysisContext) {
        return true;
    }
    private void printTenantInfo(){
     log.info("租户数量："+clusterInfos.size());
      clusterInfos.values().forEach(value -> log.info("租户信息："+value));
    }

}
